package com.mastercard.assets.web.util.to;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblTipoCuentaPaquete;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;

public class ManejadorPaquetesAsignados
{
	private TblCuenta count ;
	private int cveCuenta ;
	
	private List< PaqueteAutorizado > paqueteAutorizadoLista = new ArrayList< PaqueteAutorizado >( ) ;
	
	public int getCveCuenta() {
		return cveCuenta;
	}

	public void setCveCuenta(int cveCuenta) {
		this.cveCuenta = cveCuenta;
	}

	public TblCuenta getCount() {
		return count;
	}

	public void setCount(TblCuenta count) {
		this.count = count;
	}

	public void initialize( )
		throws
			MasterCardException
	{
		// en caso de 0 o menos
		if( cveCuenta > 0 )
			// trae el tipo de cuenta
			count = MasterCardDAO.findCountById( cveCuenta ) ;
		
		// en caso de null
		if( count == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.paquetesautorizados.CountIdNotExist" , cveCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEASIGNED_COUNT_ID_NOT_EXITS , 
					null ) ;
		
		// toma los paquetes de la cuenta
		List< TblCuentaPaquete > paquetesDeCuenta = MasterCardDAO.findPackagesByCount( cveCuenta ) ;
//                MasterCardDAO.closeEntityManager( ) ;
//		List< TblCuentaPaquete > paquetesDeCuenta = count.getTblCuentaPaquetes( ) ;
		
//		System.out.println( "Paquetes de cuenta " + count.getNombre( ) + ": " + paquetesDeCuenta.size( ) ) ;
//		
		// Recorre los cuentapaquetes
		for( TblCuentaPaquete cuentaPaq : paquetesDeCuenta )
		{
			// en caso de que status sea 0
			if( cuentaPaq.getStatus( ) == 0 )
				continue ;
			
			TblPaquete paq = cuentaPaq.getTblPaquete( ) ;
			
			// en caso de que status sea 0
			if( paq.getStatus( ) == 0 || paq.getTblAsset( ) == null )
				continue ;
			
//			System.out.println( "Bandera de tipo cuenta paq: " + cuentaPaq.getBandera( ) ) ;
//			
			int bandera = cuentaPaq.getBandera( ) ;
			
			// en caos de que este asignado (1) o regresado (3), no en campana(2)
//			if( bandera != 2 )
//			{
				// verifica el paquete
				// paqueteautorizado al que introducira el paquete
				PaqueteAutorizado paqAutInt = null ;
				
				// recorre los PaqeteSolicitar
				for( PaqueteAutorizado paqAut : paqueteAutorizadoLista )
				{
					// para cada paquete verifica si es del mismo paqueteSolicitar
					// en caso d euqe sea del mismo
					if( paqAut.verifyPackage( cuentaPaq ) )
					{
						// asitna paqueteSolicitar
						paqAutInt = paqAut ;
						
						// rompe ciclo
						break ;
					}
				}
				
				// en caso de que paqAutInt sea null
				if( paqAutInt == null )
				{
					paqAutInt = new PaqueteAutorizado( paq.getHabitacion( ) , paq.getTblAsset( ) , cveCuenta ) ;
					
					// agrega al arreglo
					paqueteAutorizadoLista.add( paqAutInt ) ;
				}
				
				// agreag el tipo de cuenta paquetes
				paqAutInt.addPackageCount( cuentaPaq ) ;
//			}
			// ya quedo por cada paqueteTipoCuenta.
		}// termina el ciclo for
		
		// ordena los paquetesAutorizados
		PaqueteAutorizado[ ] paqsAut = paqueteAutorizadoLista.toArray( new PaqueteAutorizado[ 0 ] ) ;
		
		// ordena
		Arrays.sort( paqsAut , new Comparator< PaqueteAutorizado >( )
				{
					public int compare( PaqueteAutorizado p1 , PaqueteAutorizado p2 )
					{
						TblAsset asset1 = p1.getEvento( ) ;
						TblAsset asset2 = p2.getEvento( ) ;
						
						if( asset1 == null || asset2 == null )
							return 0 ;
						
						// toma el nombre del asset
						String n1 = p1.getEvento( ).getNombre( ) ;
						String n2 = p2.getEvento( ).getNombre( ) ;
						
						// toma la habitacion
						int h1 = p1.getTipoHabitacion( ) ;
						int h2 = p2.getTipoHabitacion( ) ;
						
						// compara nombre
						if( n1.equals( n2 ) )
							return h2 - h1 ;
						else
							return n1.compareTo( n2 ) ;
					}
				} ) ;
		
		paqueteAutorizadoLista = new ArrayList< PaqueteAutorizado >( ) ;
		for( PaqueteAutorizado pa : paqsAut )
			paqueteAutorizadoLista.add( pa ) ;
		
	}// termina el metodo de inicializacion
	
	public int getPackageAsigned( )
	{
		// en caso de null
		if( this.paqueteAutorizadoLista == null || this.paqueteAutorizadoLista.size( ) == 0 )
			return 0 ;
		
		return paqueteAutorizadoLista.size( ) ;
	}

	public List<PaqueteAutorizado> getPaqueteAutorizadoLista() {
		return paqueteAutorizadoLista;
	}
	
}




